package br.com.werp.regras.pessoa.integracao;

import br.com.werp.regras.geral.ErroPadrao;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.pessoa.PessoaFisicaVO;
import br.com.werp.regras.geral.vos.tabelas.Fisica;
import br.com.werp.regras.geral.vos.tabelas.Fornecedor;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;


/**
 * @author Sobreira
 * Criado em 05/01/2005
 *
 */
public class PessoaFisicaDAO extends PessoaDAO {
    private static final String EXISTE_CPF = "EXISTE_CPF";
    private static final String EXISTE_CPF_ALTERACAO = "EXISTE_CPF_ALTERACAO";
    private static PessoaFisicaDAO pessoaFisicaDAO;

    public PessoaFisicaDAO(String banco) throws Exception {
        super(banco);
    }

    public static PessoaFisicaDAO getPessoaFisicaDAO()
        throws Exception {
        if (pessoaFisicaDAO == null) {
            ResourceBundle bundle = ResourceBundle.getBundle(Constantes.CONFIG);
            pessoaFisicaDAO = new PessoaFisicaDAO(bundle.getString(
                        Constantes.BANCO));
        }

        return pessoaFisicaDAO;
    }

    public void inserirPessoaFisica(Fisica fisica, Object conn)
        throws Exception {
        Connection connection = validarTransacao(conn);
        List excluidas = new ArrayList();

        if (fisica.getFisc_naturalidade() == 0) {
            excluidas.add("fisc_naturalidade");
        }

        if (Util.isNullOrEmpty(fisica.getFisc_cpf())) {
            excluidas.add("fisc_cpf");
        }

        inserirVO(connection, fisica,
            Util.converterListDeStringParaArrayDeString(excluidas));
    }

    public List obterPessoasFisica(PessoaFisicaVO pessoaFisicaVO, Object conn)
        throws Exception {
        Connection connection = (Connection) conn;
        String tabela = "pessoa,fisica";
        String where = " and Pess_id = Fisc_pessoa";

        if (!Util.isNullOrEmpty(pessoaFisicaVO.getPess_nome())) {
            where += (" and pess_nome like " +
            aspasLike(pessoaFisicaVO.getPess_nome()));
            pessoaFisicaVO.setPess_nome(null);
        }

        if (!Util.isNullOrEmpty(pessoaFisicaVO.getFisc_cpf())) {
            where += (" and fisc_cpf like " +
            aspasLike(pessoaFisicaVO.getFisc_cpf()));
            pessoaFisicaVO.setFisc_cpf(null);
        }

        return pesquisarVO(connection, pessoaFisicaVO, where, tabela,
            PessoaFisicaVO.EXCLUIDAS);
    }

    public List obterPessoaFisicaVO(PessoaFisicaVO pessoaFisicaVO)
        throws Exception {
        Connection conn = getConexao();

        try {
            return obterPessoasFisica(pessoaFisicaVO, conn);
        } finally {
            liberaConeccao(conn);
        }
    }

    public void atualizarPessoaFisica(Fisica fisica, Object conn)
        throws ErroPadrao, SQLException, Exception {
        List excluidas = new ArrayList();

        if (fisica.getFisc_naturalidade() == 0) {
            excluidas.add("fisc_naturalidade");
        }

        if (Util.isNullOrEmpty(fisica.getFisc_estado_civil())) {
            fisica.setFisc_estado_civil(" ");
        }

        atualizarVO(validarTransacao(conn), fisica,
            new String[] { "fisc_pessoa" },
            Util.converterListDeStringParaArrayDeString(excluidas));
    }

    public boolean existeCPF(String fisc_cpf) throws Exception {
        Connection conn = null;

        try {
            conn = getConexao();

            String query = getQuery(EXISTE_CPF);
            PreparedStatement statement = conn.prepareStatement(query);
            setString(1, statement, fisc_cpf);

            ResultSet resultSet = statement.executeQuery();

            return resultSet.next();
        } finally {
            liberaConeccao(conn);
        }
    }

    public boolean existeCPF(String cpf, String fisc_pesoa)
        throws Exception {
        Connection conn = null;

        try {
            String query = getQuery(EXISTE_CPF_ALTERACAO);
            conn = getConexao();

            PreparedStatement statement = conn.prepareStatement(query);
            setString(1, statement, cpf);
            setString(2, statement, fisc_pesoa);

            ResultSet resultSet = statement.executeQuery();

            return resultSet.next();
        } catch (Exception e) {
            throw e;
        } finally {
            liberaConeccao(conn);
        }
    }

    public void excluirPessoaFisica(Object key, Fisica fisica)
        throws Exception {
        Connection conn = validarTransacao(key);

        excluirVO(conn, fisica);
    }

    public List pesquisarFisica(Fisica fisica) throws Exception {
        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, fisica);
        } finally {
            liberaConeccao(connection);
        }
    }

    public List pesquisarFornecedor(Fornecedor fornecedor)
        throws Exception {
        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, fornecedor);
        } finally {
            liberaConeccao(connection);
        }
    }
}
